<?php

namespace App\Handlers;


use Illuminate\Support\Str;
use Intervention\Image\Facades\Image;
use Symfony\Component\HttpFoundation\File\UploadedFile;

class ImageUploadHandler
{
    protected $allowed_ext = ['png', 'jpg', 'gif', 'jpeg'];

    /**
     * @param $file UploadedFile
     * @param $folder
     * @param $file_prefix
     *
     * @data 2022/11/7
     * @author fanzhaogui
     */
    public function save($file, $folder, $file_prefix, $max_width = false)
    {
        // 构建存储的文件夹规则，值如：uploads/images/avatars/202211/11/
        // 文件夹截割能让查找效率更高
        $folder_name = "uploads/images/{$folder}/" . date("Ym/d", time());

        // 文件具体存储的屋里路径 public_path() 获取的是 public 文件夹的物理路径
        // 如： /www/www_root/shop.test/public/uploads/images/avatars/202211/11/
        $upload_path = public_path() . "/" . $folder_name;

        // 获取文件的后缀名，因图片从剪贴板里粘贴时后缀名为空，所以此处确保后缀一直存在
        $extension = strtolower($file->getClientOriginalExtension()) ?: "png";

        // 如果上传的不是图片
        if (!in_array($extension, $this->allowed_ext)) {
            return false;
        }

        // 拼接文件名，加前缀是为了增加辨析度，前缀可以是相关数据模型的 IO
        // 值如：aa_1432424123123_8nfsaol320.png
        $filename = $file_prefix . "_" . time() . "_" . Str::random(10) . "." . $extension;

        $file->move($upload_path, $filename);

        // 如果限制了图片宽度
        if ($max_width || $extension != 'gif') {
            // 此类中封装的函数，用于裁剪图片
            $this->reduceSize($upload_path . '/' . $filename, $max_width);
        }

        return [
            'path' => config('app.url') . "/$folder_name/$filename"
        ];
    }

    public function reduceSize($file_path, $max_width)
    {
        // 实例化，参数是文件的磁盘物理位置
        $image = Image::make($file_path);

        // 进行大小裁剪
        $image->resize($max_width, null, function ($constrait) {
            // 设定宽度是 $max_width，高度等比例缩放
            $constrait->aspectRatio();

            // 防止裁图时图片尺寸变大
            $constrait->upsize();
        });

        // 对图片修改后进行保存
        $image->save();
    }
}
